﻿#ifndef CWEBREQUESTAPI_H
#define CWEBREQUESTAPI_H

#include <QObject>
#include <shlib/viewmodel/imodel.h>
#include <QSharedPointer>
#include <QList>

#include <devicemodel/CModelInfo.h>
#include <devicemodel/CRtModelYxInfo.h>
#include <devicemodel/CRtModelYcInfo.h>
#include <devicemodel/CRtModelYkInfo.h>
#include <devicemodel/CRtModelParameterInfo.h>
#include <devicemodel/CRtDeviceInfo.h>

#include <protocol/modbus/cmodbusmapinfo.h>
#include <protocol/modbus/cmodbusunitcoil.h>
#include <protocol/modbus/cmodbusunitregister.h>

#include <shlib/iottypedef.h>

#define SIMULATION_SIG_NUM 50
#define TEST_MODEL 1
#define TEST_MODEL_YX 1
#define TEST_MODEL_YC 1

#define TYPE        "type"
#define DATABASE    "database"
#define RT          "rt"
#define TOKEN       "token"
#define REQ_STATE   "state"


class CWebRequestApi : public QObject
{
    Q_OBJECT

    explicit CWebRequestApi(QObject *parent = nullptr);

public:
    static CWebRequestApi& ins();

    /*******************************************模型相关*****************************************/
    /**
     * @brief 获取所有模型
     * @param 传入传出，模型列表引用
     */
    bool getModelList(QList<QSharedPointer<CModelInfo> > &modelList);

    /**
     * @brief 添加模型
     * @param 传入传出，模型列表引用
     */
    bool addModel(QSharedPointer<CModelInfo>& info);
    /*******************************************************************************************/

    /*******************************************设备相关*****************************************/
    /**
     * @brief 添加设备
     * @param 传入传出，设备引用
     */
    bool addDevice(CRtDeviceInfo &info);

    /**
     * @brief 读取某个模型相关的设备列表
     * @param 传入传出，设备列表引用
     */
    bool getDevicesByModel(const QString userid, const QString modelName, QList<CRtDeviceInfo> &devlist, bool is_rt = true);
    /*******************************************************************************************/

    /*******************************************模型信号相关*****************************************/
    /**
     * @brief 添加遥信
     * @param ：yx:遥信模型对象
     */
    bool addYx(QSharedPointer<CRtModelYxInfo>& yx);

    /**
     * @brief 修改遥信
     * @param ：yx:遥信模型对象
     */
    bool changeYx(QSharedPointer<IModel>& yx);

    /**
     * @brief 获取遥信，yxs为空则获取所有，如果不为空则获取yxs数组中指定名字的遥信
     * @param yxList：传入传出，遥信列表引用
     * @param modelName：模型名字
     */
    bool getModelYxList(QList<QSharedPointer<IModel> > &yxList, QString modelName, QStringList yxs = {});

    /**
     * @brief 添加遥测
     * @param ：yc:遥测模型对象
     */
    bool addYc(QSharedPointer<CRtModelYcInfo>& yc);

    /**
     * @brief 修改遥测
     * @param ：yc:遥测模型对象
     */
    bool changeYc(QSharedPointer<IModel>& yc);

    /**
     * @brief 获取遥测，ycs为空则获取所有，如果不为空则获取ycs数组中指定名字的遥测
     * @param ycList：传入传出，遥测列表引用
     * @param modelName：模型名字
     */
    bool getModelYcList(QList<QSharedPointer<IModel>>& ycList, QString modelName, QStringList ycs = {});

    /**
     * @brief 添加遥控
     * @param ：yk:遥控模型对象
     */
    bool addYk(QSharedPointer<CRtModelYkInfo>& yk);

    /**
     * @brief 修改遥控
     * @param ：yk:遥控模型对象
     */
    bool changeYk(QSharedPointer<IModel>& yk);

    /**
     * @brief 获取遥控，yks为空则获取所有，如果不为空则获取yks数组中指定名字的遥控
     * @param ykList：传入传出，遥控列表引用
     * @param modelName：模型名字
     */
    bool getModelYkList(QList<QSharedPointer<IModel>>& ykList, QString modelName, QStringList yks = {});

    /**
     * @brief 添加参数
     * @param ：parameter:参数模型对象
     */
    bool addParameter(QSharedPointer<CRtModelParameterInfo>& parameter);

    /**
     * @brief 修改参数
     * @param ：parameter:参数模型对象
     */
    bool changeParameter(QSharedPointer<IModel>& parameter);

    /**
     * @brief 获取参数，parameters为空则获取所有，如果不为空则获取parameters数组中指定名字的参数
     * @param parameterList：传入传出，参数列表引用
     * @param modelName：模型名字
     */
    bool getModelParameterList(QList<QSharedPointer<IModel>>& parameterList, QString modelName, QStringList parameters = {});

    /**
     * @brief 修改参数
     * @param ：parameter:参数模型对象
     */
    bool removeSig(const QList<QSharedPointer<IModel> > &sigs, QStringList& faildnames, ESigType type);
    /********************************************************************************************************************************/

    /******************************************************modbus映射相关*************************************************************/
    /**
     * @brief 为某个模型添加一个modbus映射
     * @param ：info:映射信息
     */
    bool addModbusMap(CModbusMapInfo& info);

    /**
     * @brief 读取某个模型的modbus映射信息列表
     */
    bool getModelModbusMaps(const QString userid, const QString modelName, QList<CModbusMapInfo>& infos);

    /**
     * @brief 读取遥信映射列表
     * @param ：parameter:参数模型对象
     */
    bool getModbusMapYxs(const QString userid, const QString modelName,QString mapid, QList<QSharedPointer<IModel>>& sigs);

    /**
     * @brief 修改遥信映射
     * @param sigs:信号映射列表
     */
    bool changeModbusMapYxs(QString mapid, QMap<QString, QSharedPointer<IModel>>& sigs);

    /**
     * @brief 读取遥测映射列表
     * @param ：parameter:参数模型对象
     */
    bool getModbusMapYcs(const QString userid, const QString modelName,QString mapid, QList<QSharedPointer<IModel>>& sigs);

    /**
     * @brief 修改遥测映射
     * @param sigs:信号映射列表
     */
    bool changeModbusMapYcs(QString mapid, QMap<QString, QSharedPointer<IModel>>& sigs);

    /**
     * @brief 读取遥控映射列表
     * @param ：parameter:参数模型对象
     */
    bool getModbusMapYks(const QString userid, const QString modelName,QString mapid, QList<QSharedPointer<IModel>>& sigs);

    /**
     * @brief 修改遥控映射
     * @param sigs:信号映射列表
     */
    bool changeModbusMapYks(QString mapid, QMap<QString, QSharedPointer<IModel>>& sigs);

    /**
     * @brief 读取参数映射列表
     * @param ：parameter:参数模型对象
     */
    bool getModbusMapParameters(const QString userid, const QString modelName,QString mapid, QList<QSharedPointer<IModel>>& sigs);

    /**
     * @brief 修改参数映射
     * @param sigs:信号映射列表
     */
    bool changeModbusMapParameters(QString mapid, QMap<QString, QSharedPointer<IModel>>& sigs);
    /***********************************************************************************************************************************/

protected:
    /**
     * @brief 发送一个阻塞等待的POST请求
     * @param requestBody 请求体，Json格式，responseBody 响应体，Json格式
     */
    bool sendBlockPostRequest(const QString &url, const QJsonObject &requestBody, QJsonObject &responseBody);

    /**
     * @brief 发送一个阻塞等待的GET请求
     * @param responseBody 响应体，Json格式
     */
    bool sendBlockGetRequest(const QString &url, QJsonObject &responseBody);

public:


signals:
};

#endif // CWEBREQUESTAPI_H
